As you are using OpenCascade, and not the built in geometry in gmsh, the functionality of pygmsh is slightly reduced.
What you need to add in add_raw_code
is the raw gmsh code describing the tags. In your case:
geom.add_raw_code("Physical Surface(1) = { 1 };")
geom.add_raw_code("Physical Surface(2) = {2,3,4,5,6,7};")
I found these surfaces by visual inspection in gmsh by writing the original geometry to file by:
pygmsh.generate_mesh(geom, geo_filename="mesh.geo")
To answer your second question, this is covered in: